package com.wang.study.commons;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 工具类
 */
public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取的就是用户传递的method参数，就是用户要去调用的方法名称
        String methodName = req.getParameter("method");
        //如果用户发起请求时，未传递method，或传递得不完整（method=）
        if ("".equals(methodName)||null==methodName) {
            throw new RuntimeException("当前请求中未传递method参数，无法准确调用对应的方法来处理请求！！");
        }
        Method method = null;
        try {
            method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        if (null != method) {//判断方法对象不为空
            try {
                Object returnValue = method.invoke(this,req,resp);

                if (null == returnValue) {
                    //为空时，表示请求由ajax发起，无需跳转，也就无需对返回值进行处理
                    return ;
                }else{
                    //不为空时，表示要进行跳转，需要对返回值进行相应的处理
                    String value = (String) returnValue;//  1、f:/a（:之前的是跳转方式，:之后的就是跳转的路径）  2、/a（默认的跳转方式）

                    if (value.contains(":")) {//包含了:则进行对应的处理（基于：进行字符串拆分）
                        String[] split = value.split(":");
                        String option = split[0];//返回的是跳转方式
                        String path = split[1];//返回的是跳转路径
                        if (option.equals("r")) {//重定向操作
                            resp.sendRedirect(path);
                        } else if (option.equals("f")) {//请求转发
                            req.getRequestDispatcher(path).forward(req,resp);
                        }else{
                            throw new RuntimeException("当前系统尚不支持此种类型的操作，请待系统升级后再使用！！");
                        }
                    }else{//如果不包含：，默认使用重定向来处理
                        resp.sendRedirect(value);
                    }
                }

            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }else{
            throw new RuntimeException("请求的方法不存在！！");
        }
    }
}
